package cevent.source.cloudcenter.server.service;

import cevent.source.cloudcenter.server.domain.SiteSet;
import cevent.source.cloudcenter.server.domain.SiteSetExample;
import cevent.source.cloudcenter.server.dto.PageDto;
import cevent.source.cloudcenter.server.dto.SiteSetDto;
import cevent.source.cloudcenter.server.dto.SiteSetScriptDto;
import cevent.source.cloudcenter.server.exception.SystemException;
import cevent.source.cloudcenter.server.exception.SystemExceptionCode;
import cevent.source.cloudcenter.server.mapper.SiteSetMapper;
import cevent.source.cloudcenter.server.util.DuplicateUtil;
import cevent.source.cloudcenter.server.util.UUID8Util;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

/**
 * @author cevent
 * @description 站点设置表服务层
 */
@Service
public class SiteSetService {
    private static final Logger LOG = LoggerFactory.getLogger(SiteSetService.class);
    @Resource
    private SiteSetMapper siteSetMapper;

    //1.无分页列表查询：dto获取domain参数
    public List<SiteSetDto> siteSetDtoList() {
        SiteSetExample siteSetExample = new SiteSetExample();
        siteSetExample.setOrderByClause("uni_id asc");
        List<SiteSet> siteSetList = siteSetMapper.selectByExampleWithBLOBs(siteSetExample);
        List<SiteSetDto> siteSetDtoList = new ArrayList<SiteSetDto>();
        for (int i = 0; i < siteSetList.size(); i++) {
            SiteSet siteSet = siteSetList.get(i);
            //string转为List
            List<String> seoKeyword= Arrays.asList(siteSet.getSeoKeyword().split(";"));
            //script转为dto
            LOG.info("获取到的script：{}",siteSet.getScript());
            SiteSetScriptDto scriptDto=new SiteSetScriptDto();
            if(!StringUtils.isEmpty(siteSet.getScript())){
                try {
                    //1.将字符串转为jsonObject
                    JSONObject jsonScript= JSON.parseObject(siteSet.getScript());
                    //2.将jsonObject转为javaObject
                    scriptDto=JSONObject.toJavaObject(jsonScript,SiteSetScriptDto.class);
                } catch (Exception e) {
                    e.printStackTrace();
                    throw new SystemException(SystemExceptionCode.SCRIPT_ERROR);
                }
            }

            SiteSetDto siteSetDto = new SiteSetDto();
            //复制拷贝(source,target)
            BeanUtils.copyProperties(siteSet, siteSetDto);
            //将转换的list放入dto
            siteSetDto.setSeoKeyword(seoKeyword);
            siteSetDto.setScript(scriptDto);
            siteSetDtoList.add(siteSetDto);
        }
        return siteSetDtoList;
    }

    //获取开启的站点信息
    public List<SiteSetDto> siteSetDtoOpenList(){
        SiteSetExample siteSetExample = new SiteSetExample();
        SiteSetExample.Criteria criteria=siteSetExample.createCriteria();
        criteria.andIsOpenEqualTo(1);
        siteSetExample.setOrderByClause("uni_id asc");
        List<SiteSet> siteSetList = siteSetMapper.selectByExampleWithBLOBs(siteSetExample);
        List<SiteSetDto> siteSetDtoList = new ArrayList<SiteSetDto>();
        for (int i = 0; i < siteSetList.size(); i++) {
            SiteSet siteSet = siteSetList.get(i);
            //string转为List
            List<String> seoKeyword= Arrays.asList(siteSet.getSeoKeyword().split(";"));
            //script转为dto
            LOG.info("获取到的script：{}",siteSet.getScript());
            SiteSetScriptDto scriptDto=new SiteSetScriptDto();
            if(!StringUtils.isEmpty(siteSet.getScript())){
                try {
                    //1.将字符串转为jsonObject
                    JSONObject jsonScript= JSON.parseObject(siteSet.getScript());
                    //2.将jsonObject转为javaObject
                    scriptDto=JSONObject.toJavaObject(jsonScript,SiteSetScriptDto.class);
                } catch (Exception e) {
                    e.printStackTrace();
                    throw new SystemException(SystemExceptionCode.SCRIPT_ERROR);
                }
            }

            SiteSetDto siteSetDto = new SiteSetDto();
            //复制拷贝(source,target)
            BeanUtils.copyProperties(siteSet, siteSetDto);
            //将转换的list放入dto
            siteSetDto.setSeoKeyword(seoKeyword);
            siteSetDto.setScript(scriptDto);
            siteSetDtoList.add(siteSetDto);
        }
        return siteSetDtoList;
    }

    /*2.分页查询：pageDto保存数据
        list数据集合：listPageData
        当前页码：currentPage
        每页行数：size
        总计函数：totalSize
        前端可返回pageDto，无需返回值
     */
    public void getSiteSetPageDtoList(PageDto pageDto) {
        //1.分页设置（前端传入当前页和每页行数params），起始页，每页行数size
        PageHelper.startPage(pageDto.getCurrentPage(), pageDto.getSize());
        SiteSetExample siteSetExample = new SiteSetExample();
        List<SiteSet> siteSetList = siteSetMapper.selectByExampleWithBLOBs(siteSetExample);
        //2.将mapper查询结果复制到pageInfo
        PageInfo<SiteSet> pageInfo = new PageInfo<>(siteSetList);
        //3.pageInfo计算处理处理=>后分页的总行数set到pageDto做记录
        pageDto.setTotalSize(pageInfo.getTotal());

        List<SiteSetDto> siteSetDtoList = new ArrayList<>();
        siteSetList.stream().forEach(siteSet -> {
            SiteSetDto siteSetDto = new SiteSetDto();
            BeanUtils.copyProperties(siteSet, siteSetDto);
            siteSetDtoList.add(siteSetDto);
        });

        pageDto.setListPageData(siteSetDtoList);

    }

    //3.新增、修改siteSet，将传入的id转为siteSet对象本身
    public void save(SiteSetDto siteSetDto) {
        List<String> keyword = siteSetDto.getSeoKeyword();
        //list数组转字符串str，以;分割
        StringBuilder stringBuilder = new StringBuilder();
        for (String item : keyword) {
            stringBuilder.append(item+";");
        }
        String seoKeyword = stringBuilder.toString();
        LOG.info("之前的seoKeys：{}", seoKeyword);

        //获取scriptDto转译
        SiteSetScriptDto scriptDto=siteSetDto.getScript();
        String script= null;
        if(scriptDto!=null){
            try {

                JSONObject jsonScript= (JSONObject) JSONObject.toJSON(scriptDto);
                script = jsonScript.toJSONString();
                LOG.info("scriptOBJ转译==>jsonString的存储：{}",script);
            } catch (Exception e) {
                e.printStackTrace();
                throw new SystemException(SystemExceptionCode.SCRIPT_ERROR);
            }
        }

        SiteSet siteSet = DuplicateUtil.copy(siteSetDto, SiteSet.class);
        siteSet.setSeoKeyword(seoKeyword);
        siteSet.setScript(script);
        LOG.info("保存的seoKeys：{}", siteSet.getSeoKeyword());
        if (StringUtils.isEmpty(siteSetDto.getUniId())) {
            this.insert(siteSet);
        } else {
            this.update(siteSet);
        }

    }

    //4.删除模块
    public void delete(String uniId) {
        SiteSetExample siteSetExample = new SiteSetExample();
        siteSetMapper.deleteByPrimaryKey(uniId);
    }

    //5.向外暴露dto，不暴露实体类：插入数据
    private void insert(SiteSet siteSet) {
        siteSet.setUniId(UUID8Util.getShortUUID());

        try {
            Date now = new Date();
            String date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(now);
            long time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(date).getTime();
            int timeInt = (int) (time / 1000);
            siteSet.setCreateTime(now);
            siteSet.setUpdateTime(now);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        siteSetMapper.insertSelective(siteSet);
    }

    //6.更新模块
    private void update(SiteSet siteSet) {
        try {
            Date now = new Date();
            String date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(now);
            long time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(date).getTime();
            int timeInt = (int) (time / 1000);

            siteSet.setUpdateTime(now);
        } catch (ParseException e) {
            e.printStackTrace();
        }

        siteSetMapper.updateByPrimaryKeySelective(siteSet);
    }

}
